iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
自我挑戰組

C# 和 SQL 探索之路 - 2系列 第 7

Day 7: C# Platform Invoke (P/Invoke)

  • 分享至 

  • xImage
  •  

大家好,今天是第七天,要來講的是 Platform Invoke (也常縮寫為 P/Invoke,中文或可稱為平台叫用)。

P/Invoke 允許從 Managed Code 存取 Unmanaged Code。例如從 .Net 的程式碼 (Managed) 內,存取 C++ (Unmanaged) 建立的函式庫 (Library),使用裡面的函式、結構或 Callback。
P/Invoke API 絕大部分包含在 SystemSystem.Runtime.InteropServices 命名空間。

讓我們看回之前 DLLImport 的程式碼 (Day 19: C# 引用第三方程式: DLLImport - iT 邦幫忙),並為它加上一些註解:

static class AddSharp
{
	internal static class UnsafeNativeMethods
	{
    	const string _dllLocation = "DllExample.dll";
    	[DllImport(_dllLocation)] // 重要:告知執行期間要載入的 DLL
    	public static extern int Add(int a, int b); // 關鍵:宣告相同的方法,extern 表示為外部方法 (在 DLL 內)
	}

	public static void Execute(){
    	Console.WriteLine(UnsafeNativeMethods.Add(5, 10)); // 可以用 Managed 的方式 (如一般的 C# 方法) 呼叫使用
	}
}
public void Run(){
	AddSharp.Execute();
}

因為 P/Invoke 實作上會用到 DLLImport,因此在搜尋時,很容易看到 P/Invoke, DLLImport, Managed (Code), Unmanaged (Code) 等關鍵字一起出現。

關於 Managed Code 和 Unmanaged Code 的說明如下:

  • Managed Code 表示執行於 .Net CLR,受到記憶體回收、型別安全等 .Net 機制的管理。
  • Unmanaged Code 表示不經由 .Net CLR,直接執行程式,因此不具備記憶體回收、型別安全等管理機制。
  • 更進一步的說明以及應用 (包含指標與結構),可以參考:Pointers And Unsafe Code In C# - Everything You Need To Know

另外有兩點可以注意:

  1. 在 MacOS 或 Linux 中,除了外部函式庫名稱不同以外,使用方式類似,可參閱下方參考資料。
  2. P/Invoke 是雙向的,也可以由 Unmanaged Code 呼叫 Managed Code。以下方參考資料中的例子來說,會宣告包含委派的外部方法,並傳入 C# 的委派方法。

參考資料: Platform Invoke (P/Invoke) - Microsoft Learn


上一篇
Day 6: C# Delegate 介紹
下一篇
Day 8: C# DataView 的使用
系列文
C# 和 SQL 探索之路 - 230
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言